/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import Principals.Constantes;
import Model.LogUsuario;
import Model.Parametro;
import Model.Usuario;
import Presenter.UsuarioPresenter;
import Principals.Main;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Transaction;

/**
 *
 * @author walter
 */
public class UsuarioDAO {

    public static Usuario login(String user, Parametro contrasenha) {
        Usuario usuario = null;
        try {
            Main.usrSesion.session.beginTransaction();
            Query query = Main.usrSesion.session.createQuery("from Usuario where usuario = :nombre and contrasenha = :idcontrasenha");
            query.setParameter("nombre", user);
            query.setParameter("idcontrasenha", contrasenha.getIdParametro());

            usuario = (Usuario) query.uniqueResult();
            Main.usrSesion.session.getTransaction().commit();
        } catch (Exception e) {
        } finally {
            if (usuario != null) {
                UsuarioPresenter.registrarLogUsuario(usuario, "usuario", usuario.getIdUsuario() + "->" + usuario.getUsuario(), Constantes.LOG_LOGIN);
            }
        }
        return usuario;
    }

    public static boolean buscaUsuario(String usuario) {
        Usuario usr = null;
        try {
            Main.usrSesion.session.beginTransaction();
            Query query = Main.usrSesion.session.createQuery("from Usuario where usuario = :nombre");
            query.setParameter("nombre", usuario);

            usr = (Usuario) query.uniqueResult();
            Main.usrSesion.session.getTransaction().commit();
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
        if (usr != null) {
            return true;
        } else {
            return false;
        }
    }

    public static int getIdusuario(String user) {
        Main.usrSesion.session.beginTransaction();
        Query query = Main.usrSesion.session.createQuery("from Usuario where usuario = :nombre");
        query.setParameter("nombre", user);
        Usuario usuario = (Usuario) query.uniqueResult();
        Main.usrSesion.session.getTransaction().commit();
        if (usuario == null) {
            return -1;
        } else {
            return usuario.getIdUsuario();
        }
    }

    public static Usuario olvidoContrasenha(String user) {
        Main.usrSesion.session.beginTransaction();
        Query query = Main.usrSesion.session.createQuery("from Usuario where usuario = :nombre");
        query.setParameter("nombre", user);
        Usuario usuario = (Usuario) query.uniqueResult();
        Main.usrSesion.session.getTransaction().commit();
        return usuario;
    }

    public static void cambiarContrasenha(Usuario usr) {
        try {
            Main.usrSesion.session.beginTransaction();
            Transaction tx = Main.usrSesion.session.getTransaction();
            Main.usrSesion.session.update(usr);
            tx.commit();
        } catch (Exception e) {
        } finally {
            UsuarioPresenter.registrarLogUsuario(Main.usr, "Usuario", usr.getIdUsuario() + "->" + usr.getUsuario(), Constantes.LOG_UPDATE);
        }
    }

    public static void cambiarContrasenhaOlvido(Usuario usr) {
        try {
            Main.usrSesion.session.beginTransaction();
            Transaction tx = Main.usrSesion.session.getTransaction();
            usr.setEstadoSesion(3);
            Main.usrSesion.session.update(usr);
            tx.commit();
        } catch (Exception e) {
        } finally {
            UsuarioPresenter.registrarLogUsuario(Main.usr, "Usuario", usr.getIdUsuario() + "->" + usr.getUsuario(), Constantes.LOG_UPDATE);
        }
    }

    public static List<Parametro> buscaContrasenhasHistoricas(Usuario usr) {
        Main.usrSesion.session.beginTransaction();
        Query query = Main.usrSesion.session.createQuery("from Parametro where tipo_parametro = :tipo and id_padre = :idpadre ORDER BY id_parametro DESC");
        query.setParameter("tipo", "CONTRASENHA");
        query.setParameter("idpadre", usr.getIdUsuario());

        Main.usrSesion.session.getTransaction().commit();
        query.setMaxResults(3);
        return query.list();
    }

    public static void registrarLogUsuario(Usuario usr, String tabla, String detalle, String operacion) throws UnknownHostException {
        LogUsuario log = new LogUsuario();
        log.setUsuario(usr.getUsuario());
        log.setAccion(operacion);
        log.setPerfil(usr.getPerfil().getNombre());
        log.setFecha(new Date());
        log.setTabla(tabla);
        log.setRegistro(detalle);
        InetAddress localHost = InetAddress.getLocalHost();
        log.setIp(localHost.getHostAddress());

        Main.usrSesion.session.beginTransaction();
        Transaction tx = Main.usrSesion.session.getTransaction();
        Main.usrSesion.session.save(log);
        tx.commit();
    }

    public static Usuario insertUsuario(Usuario usr) {
        try {
            Main.usrSesion.session.beginTransaction();
            Transaction tx = Main.usrSesion.session.getTransaction();
            usr.setEstadoSesion(2);
            Main.usrSesion.session.save(usr);
            tx.commit();
        } catch (Exception e) {
        } finally {
            UsuarioPresenter.registrarLogUsuario(Main.usr, "Usuario", usr.getIdUsuario() + "->" + usr.getUsuario(), Constantes.LOG_INSERT);
        }
        return usr;
    }
}
